/**
 * 读取一个文件
 *  */ 

let fs = require('fs');

// 回调的特点是error first
// fs.readFile('./1.txt', 'utf8', function(err, data){
//     if(err){
//         console.log(err)
//     } else {
//         // 如果error为空，就表示成功
//         console.log(data)
//     }
// })

/**
 * 回调函数的问题
 * 1. 无法捕获错误 try catch return
 * 2. 不能return
 * 3. 回调地狱
 */

function read(filename){
    fs.readFile(filename, 'utf8', function(err, data){
        // throw Error("出错了")
        if(err){
            console.log(err)
        } else {
            // 如果error为空，就表示成功
            console.log(data)
        }
    })
}

read('./1.txt')
console.log(222222)

/**
 * 当访问服务器的时候，请求用户列表
 * 服务器会读取模板文件，另外还要读取数据
 * 他们都是异步的
 */

// 回调地狱
// fs.readFile('./template.txt', 'utf8', function(err,temp){
//     fs.readFile('./data.txt', 'utf8', function(err, data){
//         console.log(temp + data)
//     })
// })


// 事件发布订阅来实现
// 可以创建事件发射器的实例，两个核心方法，on、emit、on监听，emit发射事件
let EventEmitter = require("events")
let eve = new EventEmitter()
let html = {} //这个html对象存放最终数据

eve.on('ready', function(key, value){
    html[key] = value
    if(Object.keys(html).length == 2){
        // console.log(html)
    }
})

fs.readFile('./template.txt', 'utf8', function(err, temp){
    // 事件名 参数
    eve.emit('ready', 'template', temp)
})

fs.readFile('./data.txt', 'utf8', function(err, data){
    eve.emit('ready', 'data', data)
})

// 通过哨兵函数来处理

// let html2 = {}
// function done(key, value){
//     html2[key] = value
//     if(Object.keys(html2).length == 2){
//         console.log(html2)
//     }
// }

function render(length, callback){
    let html = {}
    return function(key, value){
        html[key] = value
        if(Object.keys(html).length == length){
            callback(html)
        }
    }
}

let done = render(2, function(html2){
    console.log(html2)
})

fs.readFile('./template.txt', 'utf8', function(err, temp){
    done("temp", temp)
})

fs.readFile('./data.txt', 'utf8', function(err, data){
    done("data", data)
})